package cl.clientesoarest;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.Toast;
import cl.clientews.rest.PersonasSOAWS;

/**
 * Clase que maneja las operaciones CRUD de las personas
 * 
 * @author MariaJose
 * 
 */
public class Tab_PersonasSoa extends Activity {

	private Button btn_add;
	private Button btn_update;
	private Button btn_delete;
	private Button btn_findall;
	private Button btn_find;
	private ProgressDialog pdia;
	private PersonasSOAWS pws = new PersonasSOAWS();
	private String respuesta;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		/* carga la vista del layout opcionessoa */
		this.setContentView(R.layout.opcionessoa);

		btn_add = (Button) findViewById(R.id.btnadd);
		btn_update = (Button) findViewById(R.id.btn_update);
		btn_delete = (Button) findViewById(R.id.btn_delete);
		btn_findall = (Button) findViewById(R.id.btn_allfind);
		btn_find = (Button) findViewById(R.id.btn_find);

		btn_add.setOnClickListener(clickbtn);
		btn_update.setOnClickListener(clickbtn);
		btn_delete.setOnClickListener(clickbtn);
		btn_findall.setOnClickListener(clickbtn);
		btn_find.setOnClickListener(clickbtn);

	}

	// evento on Click que se genera con los botones
	private OnClickListener clickbtn = new OnClickListener() {

		@Override
		public void onClick(View v) {
			switch (v.getId()) {

			case R.id.btnadd:
				// llamada al metodo ingresar persona
				alertDialodIngreasarPersona();
				break;

			case R.id.btn_update:
				// llamada al metodo actualizar persona
				alertDialodActualizarPersona();
				break;
			case R.id.btn_delete:
				// llamada al metodo eliminar persona
				alertDialodDeletePersona();
				break;
			case R.id.btn_allfind:
				// llamada al metodo buscar todas las personas
				alertDialodFindAllPersona();
				break;
			case R.id.btn_find:
				// llamada al metodo de buscar persona
				alertDialodFindPersona();
				break;

			}

		}
	};

	/**
	 * Metodo que ingresa los datos de una persona.
	 * 
	 * @return void
	 * @author MariaJose
	 */
	public void alertDialodIngreasarPersona() {

		LayoutInflater factory = LayoutInflater.from(this);
		final View textEntryView = factory.inflate(R.layout.addpersona, null);
		AlertDialog.Builder alert = new AlertDialog.Builder(this);

		alert.setTitle("Ingrese Persona");
		alert.setView(textEntryView);

		alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int whichButton) {
				/*
				 * declara variables de los compontes que se encuentran en la
				 * vista del layout del AlertDialog
				 */
				EditText textorut;
				EditText textodig;
				EditText textnombre;
				RadioButton radio_masculino;
				RadioButton radio_femenino;

				textorut = (EditText) textEntryView.findViewById(R.id.edit_rut);
				textodig = (EditText) textEntryView.findViewById(R.id.edit_dig);
				textnombre = (EditText) textEntryView
						.findViewById(R.id.edit_nombre);
				radio_femenino = (RadioButton) textEntryView
						.findViewById(R.id.radioFemenino);
				radio_masculino = (RadioButton) textEntryView
						.findViewById(R.id.radioMasculino);

				// extrae el valor que fue escrito en los EditText por el
				// usuario
				String rut = textorut.getText().toString();
				String dig = textodig.getText().toString();
				String nombre = textnombre.getText().toString();

				// le da un valor al sexo segun radioButton seleccionado
				int sexo = -1;
				if (radio_femenino.isChecked()) {
					sexo = 0;
				}
				if (radio_masculino.isChecked()) {
					sexo = 1;
				}

				if (rut.equals("") || dig.equals("") || nombre.equals("")
						|| sexo == -1) {

					alertDialodIngreasarPersona();
				} else {
					// llama al Servicio Web addPersona()

					addPersona(rut, dig, nombre, sexo+"");
					return;
				}
			}
		});

		alert.setNegativeButton("Cancel",
				new DialogInterface.OnClickListener() {

					public void onClick(DialogInterface dialog, int which) {
						return;
					}
				});
		alert.show();
	}

	/**
	 * Metodo que actualiza los datos de una persona.
	 * 
	 * @return void
	 * @author MariaJose
	 */
	public void alertDialodActualizarPersona() {

		LayoutInflater factory = LayoutInflater.from(this);
		final View textEntryView = factory
				.inflate(R.layout.updatepersona, null);
		AlertDialog.Builder alert = new AlertDialog.Builder(this);
		alert.setTitle("Actualizar Persona");
		alert.setView(textEntryView);

		alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int whichButton) {

				EditText textorutonombre;
				EditText textonuevo;
				RadioButton radio_nombre;
				RadioButton radio_rut;
				RadioButton radio_digito;
				RadioButton radio_sexo;

				textorutonombre = (EditText) textEntryView
						.findViewById(R.id.edit_rut_nombre);
				textonuevo = (EditText) textEntryView
						.findViewById(R.id.edit_nuevovalor);
				radio_nombre = (RadioButton) textEntryView
						.findViewById(R.id.radionombre);
				radio_rut = (RadioButton) textEntryView
						.findViewById(R.id.radiorut);
				radio_digito = (RadioButton) textEntryView
						.findViewById(R.id.radiodigito);
				radio_sexo = (RadioButton) textEntryView
						.findViewById(R.id.radiosexo);

				String rutonombre = textorutonombre.getText().toString();
				String nuevocampo = textonuevo.getText().toString();
				int opcionRbtn = -1;

				if (radio_nombre.isChecked()) {
					opcionRbtn = 0;
				}
				if (radio_rut.isChecked()) {
					opcionRbtn = 1;
				}
				if (radio_digito.isChecked()) {
					opcionRbtn = 2;
				}

				if (radio_sexo.isChecked()) {
					opcionRbtn = 3;
				}

				if (rutonombre.equals("") || nuevocampo.equals("")
						|| opcionRbtn == -1) {

					alertDialodActualizarPersona();
				} else {

					// String resultado = pws.updatePersona(rutonombre,
					// opcionRbtn, nuevocampo);
					// Toast.makeText(getBaseContext(), resultado,
					// Toast.LENGTH_SHORT).show();
					updatePersona(rutonombre, opcionRbtn, nuevocampo);
					return;
				}

			}
		});

		alert.setNegativeButton("Cancel",
				new DialogInterface.OnClickListener() {

					public void onClick(DialogInterface dialog, int which) {
						return;
					}
				});
		alert.show();
	}

	/**
	 * Metodo que elimina una persona segun su rut.
	 * 
	 * @return void
	 * @author MariaJose
	 */
	public void alertDialodDeletePersona() {

		LayoutInflater factory = LayoutInflater.from(this);
		final View textEntryView = factory
				.inflate(R.layout.deletepersona, null);
		AlertDialog.Builder alert = new AlertDialog.Builder(this);
		alert.setTitle("Eliminar Persona");
		alert.setView(textEntryView);

		alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int whichButton) {

				EditText textorut;
				textorut = (EditText) textEntryView
						.findViewById(R.id.edit_rut_delete);
				String rut = textorut.getText().toString();

				if (rut.equals("")) {
					alertDialodDeletePersona();
				} else {
					deletePersona(rut);
					return;
				}
			}
		});

		alert.setNegativeButton("Cancel",
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
						return;
					}
				});
		alert.show();
	}

	private void addPersona(String rut, String dig, String nombre, String sexo) {
		new addPersonaTask().execute(rut, dig, nombre, sexo);
	}

	private void deletePersona(String rut) {
		new deletePersonaTask().execute(rut);
	}

	private void updatePersona(String rutonombre, int opcionRbtn, String nuevocampo) {
		new updatePersonaTask().execute(rutonombre, opcionRbtn+"", nuevocampo);
	}

	private void findPersona(String buscar) {
		new findPersonaTask().execute(buscar);
	}

	private void findAllPersona(String buscar) {
		respuesta = pws.findAllPersona(buscar);
		Intent i = new Intent();
		i.setClass(Tab_PersonasSoa.this, ResultadoFindPersona.class);
		// entrega el Json que es devuelto por el servicio
		i.putExtra("datos", respuesta);
		startActivity(i);
		
		new findAllPersonaTask().execute(buscar);
	}

	/**
	 * Metodo que busca a una persona.
	 * 
	 * @return void
	 * @author MariaJose
	 */
	public void alertDialodFindPersona() {

		LayoutInflater factory = LayoutInflater.from(this);
		final View textEntryView = factory.inflate(R.layout.findpersona, null);
		AlertDialog.Builder alert = new AlertDialog.Builder(this);
		alert.setTitle("Buscar Persona");
		alert.setView(textEntryView);

		alert.setPositiveButton("Buscar",
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int whichButton) {
						EditText textoFind;
						textoFind = (EditText) textEntryView.findViewById(R.id.edit_find_persona);

						String buscar = textoFind.getText().toString();
						if (buscar.equals("")) {
							alertDialodFindPersona();
						} else {
							/**
							 * realiza la llamada de buscar al Ws
							 */
							findPersona(buscar);
							return;
						}
					}
				});

		alert.setNegativeButton("Salir", new DialogInterface.OnClickListener() {

			public void onClick(DialogInterface dialog, int which) {
				return;
			}
		});
		alert.show();
	}

	/**
	 * Metodo que busca a todas las personas segun parametro de busqueda.
	 * 
	 * @return void
	 * @author MariaJose
	 */
	public void alertDialodFindAllPersona() {

		LayoutInflater factory = LayoutInflater.from(this);
		final View textEntryView = factory.inflate(R.layout.findpersona, null);
		AlertDialog.Builder alert = new AlertDialog.Builder(this);
		alert.setTitle("Buscar registros con :");
		alert.setView(textEntryView);

		alert.setPositiveButton("Buscar",
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int whichButton) {
						
						EditText textoFind;
						textoFind = (EditText) textEntryView.findViewById(R.id.edit_find_persona);

						String buscar = textoFind.getText().toString();

						/*
						 * realiza la llamada de buscar al Ws y lanza una nueva
						 * actividad para mostrar los datos de la busqueda.
						 */
						findAllPersona(buscar);

						return;
					}

				});

		alert.setNegativeButton("Salir", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				return;
			}
		});
		alert.show();
	}
	
	private class addPersonaTask extends AsyncTask<String, Void, String>{
		
		@Override
		protected void onPreExecute(){
			 super.onPreExecute();
		        pdia = new ProgressDialog(Tab_PersonasSoa.this);
		        pdia.setMessage("Cargando...");
		        pdia.show(); 
		}

		@Override
		protected String doInBackground(String... params) {
			String resultado = pws.addPersona(params[0], params[1], params[2], params[3]);
			return resultado;
		}
		@Override
	    protected void onPostExecute(String result) {
			pdia.dismiss();
			Toast.makeText(getBaseContext(), result, Toast.LENGTH_SHORT).show();
	    }
		@Override
        protected void onCancelled() {
            Toast.makeText(Tab_PersonasSoa.this, "Tarea cancelada!",
                Toast.LENGTH_SHORT).show();
        }
	}		 
	private class deletePersonaTask extends AsyncTask<String, Void, String>{

		@Override
		protected void onPreExecute(){
			 super.onPreExecute();
		        pdia = new ProgressDialog(Tab_PersonasSoa.this);
		        pdia.setMessage("Cargando...");
		        pdia.show(); 
		}
		
		@Override
		protected String doInBackground(String... params) {
			String resultado = pws.deletePersona(params[0]);
			return resultado;
		}
		@Override
	    protected void onPostExecute(String result) {
			pdia.dismiss();
			Toast.makeText(getBaseContext(), result, Toast.LENGTH_SHORT).show();
	    }
		@Override
        protected void onCancelled() {
            Toast.makeText(Tab_PersonasSoa.this, "Tarea cancelada!",
                Toast.LENGTH_SHORT).show();
        }  
	}
	private class updatePersonaTask extends AsyncTask<String, Void, String>{

		@Override
		protected void onPreExecute(){
			 super.onPreExecute();
		        pdia = new ProgressDialog(Tab_PersonasSoa.this);
		        pdia.setMessage("Cargando...");
		        pdia.show(); 
		}
		
		@Override
		protected String doInBackground(String... params) {
			String resultado = pws.updatePersona(params[0],params[1],params[2] );
			return resultado;
		}
		@Override
	    protected void onPostExecute(String result) {
			pdia.dismiss();
			Toast.makeText(getBaseContext(), result, Toast.LENGTH_SHORT).show();
	    }
		@Override
        protected void onCancelled() {
            Toast.makeText(Tab_PersonasSoa.this, "Tarea cancelada!",
                Toast.LENGTH_SHORT).show();
        }  
	}
	private class findPersonaTask extends AsyncTask<String, Void, String>{

		@Override
		protected void onPreExecute(){
			 super.onPreExecute();
		        pdia = new ProgressDialog(Tab_PersonasSoa.this);
		        pdia.setMessage("Cargando...");
		        pdia.show(); 
		}
		
		@Override
		protected String doInBackground(String... params) {
			String resultado = pws.findPersona(params[0]);
			return resultado;
		}
		@Override
	    protected void onPostExecute(String result) {
			pdia.dismiss();
			Toast.makeText(getBaseContext(), result, Toast.LENGTH_SHORT).show();
	    }
		@Override
        protected void onCancelled() {
            Toast.makeText(Tab_PersonasSoa.this, "Tarea cancelada!",
                Toast.LENGTH_SHORT).show();
        }
	}
	
	private class findAllPersonaTask extends AsyncTask<String, Void, String>{

		@Override
		protected void onPreExecute(){
			 super.onPreExecute();
		        pdia = new ProgressDialog(Tab_PersonasSoa.this);
		        pdia.setMessage("Cargando...");
		        pdia.show(); 
		}
		
		@Override
		protected String doInBackground(String... params) {
			String resultado = pws.findAllPersona(params[0]);
			return resultado;
		}
		@Override
	    protected void onPostExecute(String result) {
	      pdia.dismiss();
	      Intent i = new Intent();
			i.setClass(Tab_PersonasSoa.this, ResultadoFindPersona.class);
			// entrega el Json que es devuelto por el servicio
			i.putExtra("datos", respuesta);
			startActivity(i);
	    }
		@Override
        protected void onCancelled() {
            Toast.makeText(Tab_PersonasSoa.this, "Tarea cancelada!",
                Toast.LENGTH_SHORT).show();
        }
	}


}
